﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Grupo3.Scenes;
using Grupo3.Objetos;

namespace Grupo3.Telas
{
    class Level : SceneBase
    {
        Player player;
        Inimigo inimigo;
        Item moeda;
        Hud vida;
        HighScore score;
        Objeto2D level;

        int contadorInimigo;
        int contadorMoeda;

        Random random = new Random();

        List<Inimigo> listaInimigo;
        List<Item> listaMoeda;


        public override void Start()
        {
            level = new Objeto2D(Game1.instancia.Content.Load<Texture2D>("level"), new Vector2(0, 0));
            score = new HighScore();
            vida = new Hud();
            
            player = new Player(Game1.instancia.Content.Load<Texture2D>("player"), new Vector2(Game1.instancia.Window.ClientBounds.Width / 2, Game1.instancia.Window.ClientBounds.Height / 2));
            player.position.X -= player.texture.Width / 2;
            player.position.Y -= player.texture.Height / 2;
            
            listaInimigo = new List<Inimigo>();
            listaMoeda = new List<Item>();


        }

        private void criarObjetos()
        {
            // CRIAR TIMER PARA ESPALNAR INIMIGOS E MOEDAS NA TELA ALEATORIAMENTE!!!
        }

        public override void Update(GameTime gameTime)
        {
           
            player.Update(gameTime);
            level.Update(gameTime);
            score.Update(gameTime);
            vida.Update(gameTime);
            

            criarObjetos();

            for (int i = 0; i < listaMoeda.Count(); i++)
            {
                listaMoeda[i].Update(gameTime);
            }

            for (int j = 0; j < listaInimigo.Count(); j++)
            {
                listaInimigo[j].Update(gameTime);
            }

            adicionarInimigo();
            adicionarMoeda();

            detectarColisaoPlayerInimigo();
            detectarColisaoPlayerMoeda();
            colisaoParedePlayer();
            colisaoParedeInimigo();

             
        }

        public void adicionarInimigo()
        {
            if (listaInimigo.Count < 3)
            {
                contadorInimigo++;

                if (contadorInimigo == 60)
                {
                    contadorInimigo = 0;
                    int randomX = random.Next(100, 400);
                    int randomY = random.Next(100, 300);

                    inimigo = new Inimigo(Game1.instancia.Content.Load<Texture2D>("inimigo"), new Vector2(randomX, randomY));
                    listaInimigo.Add(inimigo);
                }
            }
        }

        public void adicionarMoeda()
        {
            if (listaMoeda.Count < 1)
            {
                contadorMoeda++;

                if (contadorMoeda == 60)
                {
                    contadorMoeda = 0;
                    int randomX = random.Next(100, 400);
                    int randomY = random.Next(100, 300);

                    moeda = new Item(Game1.instancia.Content.Load<Texture2D>("moeda"), new Vector2(randomX, randomY));
                    listaMoeda.Add(moeda);
                }
            }
        }

        private void detectarColisaoPlayerMoeda()
        {
            for (int i = 0; i < listaMoeda.Count(); i++)
            {
                if (player.collisionBox().Intersects(listaMoeda[i].collisionBox()))
                {
                    listaMoeda.RemoveAt(i);
                    score.pontuacao++;
                    Console.WriteLine("PONTO!!!");
                }
            }
        }
        
        private void detectarColisaoPlayerInimigo()
        {
            for(int j = 0; j < listaInimigo.Count(); j++)
            {
                if (player.collisionBox().Intersects(listaInimigo[j].collisionBox()) && player.isInvulnerable == false)
                {
                    player.perderVida(1);
                    vida.hudVida--;
                    Console.WriteLine("PERDER VIDA");
                }
            }
        }

        private void colisaoParedePlayer()
        {
            if (player.position.X <= 0)
            {
               player.position.X = 0;
            }

            if (player.position.Y <= 0)
            {
                player.position.Y = 0;
            }

            if (player.position.X > 800 - player.texture.Width)
            {
                player.position.X = 800 - player.texture.Width;
            }

            if (player.position.Y > 480 - player.texture.Height)
            {
                player.position.Y = 480 - player.texture.Height;
            }
        }

        private void colisaoParedeInimigo()
        {
            for (int i = 0; i < listaInimigo.Count; i++)
            {
                if (listaInimigo[i].position.X <= 0)
                {
                    listaInimigo[i].position.X = 0;
                }

                if (listaInimigo[i].position.Y <= 0)
                {
                    listaInimigo[i].position.Y = 0;
                }

                if (listaInimigo[i].position.X > 800 - inimigo.texture.Width)
                {
                    listaInimigo[i].position.X = 800 - inimigo.texture.Width;
                }

                if (listaInimigo[i].position.Y > 480 - inimigo.texture.Height)
                {
                    listaInimigo[i].position.Y = 480 - inimigo.texture.Height;
                }
            }
        }

        public override void Draw(SpriteBatch spriteBatch)
        {
            level.Draw(spriteBatch);
            player.Draw(spriteBatch);
            score.Draw(spriteBatch);
            vida.Draw(spriteBatch);
            

            for (int i = 0; i < listaMoeda.Count(); i++)
            {
                listaMoeda[i].Draw(spriteBatch);
            }

            for (int j = 0; j < listaInimigo.Count(); j++)
            {
                listaInimigo[j].Draw(spriteBatch);
            }
        }

        public override void Terminate()
        {

        }

    }

}
